package com.yc.fav.demo;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class Junit {

    /**
     * 执行测试类的所有测试方法
     * @param tester   被测试的对象
     */
    public void test(Object tester){
        // 获取该类定义的所有方法
        Method[] declaredMethods = tester.getClass().getDeclaredMethods();
        // 所有被测试的方法集合
        List<Method> testMethods = new ArrayList<>();
        for (Method method : declaredMethods) {
            if(method.getAnnotation(Test.class) != null){
                testMethods.add(method);
            }
        }

        // 1.定义 Before 和 After 注解
        // 2.执行所有的被测试方法
        // 3.统计测试结果
        //      1) 正常执行完成  ==> 正确 OK
        //      2) 如果出现异常  ==> 错误 error
        //      3) 断言错误     ==> 失败 failure
    }

}

class Test1 {

    // @Before
    public void before1(){
        System.out.println("每一个测试方法执行前, 执行的方法 before1");
    }

    // @Before
    public void before2(){
        System.out.println("每一个测试方法执行前, 执行的方法 before2");
    }

    // @After
    public void after(){
        System.out.println("每一个测试方法执行后, 执行的方法");
    }


    @Test
    public void test1(){
        System.out.println("测试方法1");
    }

    @Test
    public void test2(){
        System.out.println("测试方法2");
        int i = 1/0;
    }

    @Test
    public void test3(){
        System.out.println("测试方法3");
        throw new AssertionError("断言错误");
    }

    public void test4(){
        System.out.println("不是测试方法");
    }
}

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface Test {

}
